home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dr.bub / 96000.lha / 96000 / appb / b115b.asm < prev    next >
Assembly Source File  |  1992-04-28  |  8KB  |  213 lines

  1. ; This program was originally published in the Motorola DSP96002 Users Manual
  2. ; and is provided under a DISCLAIMER OF WARRANTY available from Motorola DSP
  3. ; Operation, 6501 William Cannon Drive West, Austin, Texas 78735-8598.  For
  4. ; more information, refer to the DSP96002 Users Manual, Appendix B, DSP
  5. ; Benchmarks.
  6. ;
  7. ; B.1.15.2    Faster Radix 2 Decimation in Time FFT  
  8. ; Complex, Radix 2 Cooley-Tukey Decimation in Time FFT 
  9. ; This program has not been exhaustively tested and may contain errors. 
  10. ; Faster FFT using Programming Tricks found in Typical FORTRAN Libraries 
  11. ;      First two passes combined as a four butterfly loop since 
  12. ;            multiplies are trivial. 
  13. ;            2.25 cycles internal (4 cycles external) per Radix 2 
  14. ;            butterfly. 
  15. ;      Middle passes performed with traditional, triple-nested DO loop. 
  16. ;            4 cycles internal (8 cycles external) per Radix 2 butterfly 
  17. ;            plus overhead.  Note that a new pipelining technique is 
  18. ;            being used to minimize overhead. 
  19. ;      Next to last pass performed with double butterfly loop. 
  20. ;            4.5 cycles internal (8.5 cycles external) per Radix 2 
  21. ;            butterfly. 
  22. ;      Last pass has separate single butterfly loop. 
  23. ;            5 cycles internal (9 cycles external) per Radix 2 
  24. ;            butterfly. 
  25. ;      For 1024 complex points, average Radix 2 butterfly = 3.8 cycles 
  26. ;      internal and 7.35 cycles external, assuming a single external 
  27. ;      data bus. 
  28. ;      Because of separate passes, minimum of 32 points using these 
  29. ;      optimizations.  Approximately 150 program words required. 
  30. ;      Uses internal X and Y Data ROMs for twiddle factor coefficients 
  31. ;      for any size FFT up to 1024 complex points. 
  32. ;      Assuming internal program and internal data memory (or two 
  33. ;      external data buses), 1024 point complex FFT is 1.57 msec at 
  34. ;      75 nsec instruction rate.  Assuming internal program and 
  35. ;      external data memory, 1024 point complex FFT is 2.94 msec 
  36. ;      at 75 nsec instruction rate. 
  37. ; First two passes 
  38. ;      9 cycles internal, 1.77X faster than 4 cycle Radix 2 bfy 
  39. ;      16 cycles external, 2.0X faster than 4 cycle Radix 2 bfy 
  40. ;      r0 = a pointer in and out 
  41. ;      r6 = a pointer in 
  42. ;      r4 = b pointer in and out 
  43. ;      r1 = c pointer in and out 
  44. ;      r5 = d pointer in and out 
  45. ;      n5 = 2 
  46.  
  47.       move      #points,d1.l 
  48.       move      #passes,d9.l 
  49.       move      #data,d0.l 
  50.       move      #coef,m2 
  51.       move      #coefsize,d2.l 
  52.  
  53.       lsr       d1         d0.l,r0 
  54.       lsr       d1         r0,r2 
  55.       add       d1,d0      d1.l,d8.l 
  56.       add       d1,d0      d0.l,r4 
  57.       add       d1,d0      d0.l,r1 
  58.       lsr       d2         d0.l,r5 
  59.       lsr       d2         r0,r6 
  60.       move      #2,n5 
  61.       move      d2.l,n6 
  62.       move      #-1,m0 
  63.       move      m0,m1 
  64.       move      m0,m4 
  65.       move      m0,m5 
  66.       move      m0,m6 
  67.  
  68.       move                              x:(r0),d1.s 
  69.       move                              x:(r1),d0.s 
  70.       move                              x:(r5)-,d2.s 
  71.       move                                           y:(r5)+,d4.s 
  72.       faddsub.s d1,d0                    x:(r4),d5.s 
  73.       faddsub.s d5,d2                                 y:(r4),d7.s 
  74. ;      Combine first two passes with trivial multiplies. 
  75.       do      d8.l,_twopass 
  76.  
  77.       faddsub.s  d0,d2                                 y:(r5),d6.s 
  78.       faddsub.s  d7,d6                   d2.s,x:(r0)+  y:(r6)+,d3.s 
  79.       faddsub.s  d1,d7                   d0.s,x:(r4)   y:(r1)+,d2.s 
  80.       faddsub.s  d3,d2                   d1.s,x:(r5)- 
  81.       faddsub.s  d2,d6                   x:(r0)-,d1.s  d4.s,y:(r5)+n5 
  82.       faddsub.s  d3,d5                   x:(r1)-,d0.s  d2.s,y:(r4)+ 
  83.       faddsub.s  d1,d0                   x:(r5),d2.s   d6.s,y:(r0)+ 
  84.       ftfr.s     d5,d4                   x:(r4),d5.s   d3.s,y:(r1) 
  85.       faddsub.s  d5,d2                   d7.s,x:(r1)+  y:(r4),d7.s 
  86. _twopass 
  87.       move                                             d4.s,y:(r5)+ 
  88.  
  89. ; Middle passes 
  90.       tfr     d9,d3      #4,d0.l 
  91.       clr     d2         d8.l,d1.l 
  92.       sub     d0,d3      d2.l,m6 
  93.  
  94.       do      d3.l,_end_pass 
  95.       move    d0.l,n2 
  96.       move    r2,r0 
  97.       lsr     d1         m2,r6 
  98.       dec     d1         d1.l,n0 
  99.       dec     d1         d1.l,n1 
  100.       move    d1.l,n3 
  101.       move    n0,n4 
  102.       move    n0,n5 
  103.       lea     (r0)+n0,r1 
  104.       move    r0,r4 
  105.       move    r1,r5 
  106.       move                              x:(r6)+n6,d9.s y:,d8.s 
  107.       move                                             y:(r1),d7.s 
  108.       fmpy.s d8,d7,d3                   x:(r1)+,d6.s 
  109.       fmpy.s d9,d6,d0 
  110.       fmpy.s d9,d7,d1                                  y:(r1),d7.s 
  111.       fmpy   d8,d6,d2  fadd.s    d3,d0  x:(r0),d4.s 
  112.       fmpy   d8,d7,d3  faddsub.s d4,d0  x:(r1)+,d6.s 
  113.  
  114.       do      n2,_end_grp 
  115.  
  116.       do      n3,_end_bfy 
  117.       fmpy  d9,d6,d0   fsub.s    d1,d2  d0.s,x:(r4)    y:(r0)+,d5.s 
  118.       fmpy  d9,d7,d1   faddsub.s d5,d2  d4.s,x:(r5)    y:(r1),d7.s 
  119.       fmpy  d8,d6,d2   fadd      d3,d0  x:(r0),d4.s    d2.s,y:(r5)+ 
  120.       fmpy  d8,d7,d3   faddsub.s d4,d0  x:(r1)+,d6.s   d5.s,y:(r4)+ 
  121. _end_bfy 
  122.       move      (r1)+n1 
  123.       fmpy  d9,d6,d0   fsub.s    d1,d2  d0.s,x:(r4)    y:(r0)+,d5.s 
  124.       fmpy  d9,d7,d1   faddsub.s d5,d2  d4.s,x:(r5)    y:(r1),d7.s 
  125.       fmpy  d8,d6,d2   fadd.s    d3,d0  x:(r0),d4.s    d2.s,y:(r5)+ 
  126.       move                              x:(r6)+n6,d9.s y:,d8.s 
  127.       fmpy  d8,d7,d3   faddsub.s d4,d0  x:(r1)+,d6.s   d5.s,y:(r4)+ 
  128.       fmpy  d9,d6,d0   fsub.s    d1,d2  d0.s,x:(r4)    y:(r0)+n0,d5.s 
  129.       fmpy  d9,d7,d1   faddsub.s d5,d2  d4.s,x:(r5)    y:(r1),d7.s 
  130.       fmpy  d8,d6,d2   fadd.s    d3,d0  x:(r0),d4.s    d2.s,y:(r5)+n5 
  131.       fmpy  d8,d7,d3   faddsub.s d4,d0  x:(r1)+,d6.s   d5.s,y:(r4)+n4 
  132. _end_grp 
  133.       move     n2,d0.l 
  134.       lsl      d0      n0,d1.l 
  135. _end_pass 
  136.  
  137. ; next to last pass 
  138.       move      d0.l,n2 
  139.       move      r2,r0 
  140.       move      r0,r4 
  141.       lea      (r0)+2,r1 
  142.       move      r1,r5 
  143.       move      m2,r6 
  144.       move      #3,n0 
  145.       move      n0,n1 
  146.       move      n0,n4 
  147.       move      n0,n5 
  148.       move                              x:(r6)+n6,d9.s  y:,d8.s 
  149.       move                                              y:(r1),d7.s 
  150.       fmpy.s d8,d7,d3                   x:(r1)+,d6.s 
  151.       fmpy.s d9,d6,d0 
  152.       fmpy.s d9,d7,d1                                   y:(r1),d7.s 
  153.       fmpy   d8,d6,d2  fadd.s    d3,d0  x:(r0),d4.s 
  154.       fmpy   d8,d7,d3  faddsub.s d4,d0  x:(r1)+n1,d6.s 
  155.  
  156.       do      n2,_end_next 
  157.       fmpy   d9,d6,d0  fsub.s    d1,d2  d0.s,x:(r4)     y:(r0)+,d5.s 
  158.       fmpy   d9,d7,d1  faddsub.s d5,d2  d4.s,x:(r5)     y:(r1),d7.s 
  159.       fmpy   d8,d6,d2  fadd.s    d3,d0  x:(r0),d4.s     d2.s,y:(r5)+ 
  160.       move                              x:(r6)+n6,d9.s  y:,d8.s 
  161.       fmpy   d8,d7,d3  faddsub.s d4,d0  x:(r1)+,d6.s    d5.s,y:(r4)+ 
  162.       fmpy   d9,d6,d0  fsub.s    d1,d2  d0.s,x:(r4)     y:(r0)+n0,d5.s 
  163.       fmpy   d9,d7,d1  faddsub.s d5,d2  d4.s,x:(r5)     y:(r1),d7.s 
  164.       fmpy   d8,d6,d2  fadd.s    d3,d0  x:(r0),d4.s     d2.s,y:(r5)+n5 
  165.       fmpy   d8,d7,d3  faddsub.s d4,d0  x:(r1)+n1,d6.s  d5.s,y:(r4)+n4 
  166. _end_next 
  167.  
  168. ; last pass 
  169.       move      n2,d0.l 
  170.       lsl       d0      r2,r0 
  171.       move      d0.l,n2 
  172.       move      r0,r4 
  173.       lea      (r0)+,r1 
  174.       move      r1,r5 
  175.       move      m2,r6 
  176.       move      #2,n0 
  177.       move      n0,n1 
  178.       move      n0,n4 
  179.       move      n0,n5 
  180.       move                              x:(r6)+n6,d9.s  y:,d8.s 
  181.       move                                              y:(r1),d7.s 
  182.       fmpy.s d8,d7,d3                   x:(r1)+n1,d6.s 
  183.       fmpy.s d9,d6,d0 
  184.       fmpy.s d9,d7,d1                                   y:(r1),d7.s 
  185.       fmpy   d8,d6,d2  fadd.s    d3,d0  x:(r0),d4.s 
  186.       move                              x:(r6)+n6,d9.s  y:,d8.s 
  187.       fmpy   d8,d7,d3  faddsub.s d4,d0  x:(r1)+n1,d6.s 
  188.  
  189.       do      n2,_end_last 
  190.       fmpy   d9,d6,d0  fsub.s    d1,d2  d0.s,x:(r4)     y:(r0)+n0,d5.s 
  191.       fmpy   d9,d7,d1  faddsub.s d5,d2  d4.s,x:(r5)     y:(r1),d7.s 
  192.       fmpy   d8,d6,d2  fadd.s    d3,d0  x:(r0),d4.s     d2.s,y:(r5)+n5 
  193.       move                              x:(r6)+n6,d9.s  y:,d8.s 
  194.       fmpy   d8,d7,d3  faddsub.s d4,d0  x:(r1)+n1,d6.s  d5.s,y:(r4)+n4 
  195. _end_last 
  196.